home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok58
/
textwindows
/
textwindows.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
6KB
|
259 lines
(*************************************************************************
:Program. TextWindows.mod
:Contents. IO for mutilible Windows
:Author. Hartmut Goebel
:Language. Oberon
:Translator. Amiga Oberon V1.17.1
:History. V1.0, 23 May 1991, Hartmut Goebel
:Update. ReadHex now also accepts lower-case charakters
:Date. 23 May 1991 15:13:37
:Support. most parts were taken form Oberon-Std-Module 'io'
:Imports. Printf (Volker Rudolph)
:Remark. Works just like 'io', but you must specify the window
:Remark. where the action should take place
:Usage. 'OpenTextWin()' - perform io - 'CloseTextWin()'
*************************************************************************)
MODULE TextWindows;
(* $OvflChk- $RangeChk- (*$StackChk-*) $NilChk- $ReturnChk- $CaseChk- *)
IMPORT
asc: ASCII,
e: Exec,
d: Dos,
prtf: Printf,
lst: Lists,
sys: SYSTEM;
TYPE
TxtWinPtr*= POINTER TO TxtWin;
TxtWin = RECORD (lst.Node)
handle: d.FileHandlePtr;
END;
String = ARRAY 40 OF CHAR;
VAR
WinList: lst.List;
(*n: lst.NodePtr;*)
n: TxtWinPtr;
sptr: POINTER TO String;
l: LONGINT;
ftemp: ARRAY 80 OF CHAR; (* schön lang! *)
helpstr: String;
(*-----------------------------------------------------------------------*)
PROCEDURE OpenTextWin*(title: ARRAY OF CHAR;
x,y,w,h: INTEGER): TxtWinPtr;
VAR
tw: TxtWinPtr;
BEGIN
NEW(tw);
IF tw=NIL THEN RETURN NIL END; (* $NilChk- *)
prtf.SPrintf5(ftemp,"CON:%ld/%ld/%ld/%ld/%s",x,y,w,h,sys.ADR(title));
tw.handle := d.Open(ftemp,d.newFile);
IF tw.handle = NIL THEN DISPOSE(tw); RETURN NIL; END;
lst.AddTail(WinList,tw);
RETURN tw; (* $NilChk= *)
END OpenTextWin;
PROCEDURE CloseTextWin*(VAR tw: TxtWinPtr);
BEGIN
lst.Remove(WinList,tw);
d.Close(tw.handle);
DISPOSE(tw); (* => tw := NIL *)
END CloseTextWin;
(*-----------------------------------------------------------------------*)
PROCEDURE * RFProc; (* $EntryExitCode- *)
BEGIN
sys.INLINE(016C0U, (* MOVE.B D0,(A3)+ *)
04E75U); (* RTS *)
END RFProc;
(*-------------------------------------------------------------------------*)
PROCEDURE Length*(str: ARRAY OF CHAR): INTEGER; (* $EntryExitCode- *)
BEGIN
sys.INLINE(02C5FH, (* move.l (sp)+,a6 *)
0301FH, (* move.w (sp)+,d0 *)
0205FH, (* move.l (sp)+,a0 *)
05340H, (* subq #1,d0 *)
03200H, (* move.w d0,d1 *)
04A18H, (* l: tst.b (a0)+ *)
057C9H, 0FFFCH, (* dbeq d1,l *)
09041H, (* sub.w d1,d0 *)
04ED6H); (* jmp (a6) *)
END Length;
(*-------------------------------------------------------------------------*)
PROCEDURE Write*(tw: TxtWinPtr; ch: CHAR);
BEGIN sys.SETREG(0,d.Write(tw.handle,ch,1)) END Write;
PROCEDURE WriteLn*(tw: TxtWinPtr);
BEGIN Write(tw,"\n") END WriteLn;
PROCEDURE WriteString*(tw: TxtWinPtr; str: ARRAY OF CHAR); (* $CopyArrays- *)
BEGIN sys.SETREG(0,d.Write(tw.handle,str,Length(str))) END WriteString;
PROCEDURE Tab*(tw: TxtWinPtr; n: INTEGER);
VAR s: ARRAY 80 OF CHAR;
i: INTEGER;
BEGIN
WHILE n>0 DO
i := 0;
REPEAT
s[i] := " ";
INC(i);
UNTIL (i=79) OR (i=n);
DEC(n,i);
s[i] := 0X;
WriteString(tw,s);
END;
END Tab;
PROCEDURE Clear*(tw: TxtWinPtr);
BEGIN Write(tw,"\f") END Clear;
(*-------------------------------------------------------------------------*)
PROCEDURE Format*(tw: TxtWinPtr; VAR str: String; data:LONGINT);
(* %% => %
links führ.0 min.max Breite longdata dez|hex|string|char
% [-] [0] [123 [.123] ] [l] (d|x|s|c)
Char ist immer in WORD, auch bei Angabe 'l'!!!
String-Adresse ist immer LONG!!!
*)
(* niemals mehr als 79 Zeichen erzeugen! *)
BEGIN
e.RawDoFmt(str,data,RFProc,sys.ADR(ftemp));
WriteString(tw,ftemp);
END Format;
(*-------------------------------------------------------------------------*)
PROCEDURE WriteInt*(tw: TxtWinPtr; x: LONGINT; n: INTEGER);
BEGIN
e.RawDoFmt('%%%dld',sys.ADR(n),RFProc,sys.ADR(helpstr));
Format(tw,helpstr,sys.ADR(x));
END WriteInt;
PROCEDURE WriteHex*(tw: TxtWinPtr; x: LONGINT; n: INTEGER);
BEGIN
IF n>=0 THEN (* RawDoFmt spinnt etwas bei neg. Zahlen und führ. 0 *)
e.RawDoFmt('%%0%dlx',sys.ADR(n),RFProc,sys.ADR(helpstr));
ELSE
n:=-n;
e.RawDoFmt('%%-%dlx',sys.ADR(n),RFProc,sys.ADR(helpstr));
END;
Format(tw,helpstr,sys.ADR(x));
END WriteHex;
(*-------------------------------------------------------------------------*)
PROCEDURE Read*(tw: TxtWinPtr; VAR ch: CHAR);
BEGIN IF d.Read(tw.handle,ch,1)#1 THEN ch := asc.eof END;
END Read;
PROCEDURE ReadString*(tw: TxtWinPtr; VAR str: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
i := 0;
REPEAT
Read(tw,str[i]);
CASE str[i] OF "\n",asc.eof,0X: str[i] := 0X; RETURN ELSE END;
INC(i);
UNTIL i=LEN(str);
END ReadString;
PROCEDURE ReadInt*(tw: TxtWinPtr; VAR x: LONGINT): BOOLEAN;
VAR
ch: CHAR;
d: LONGINT;
neg: BOOLEAN;
str: String;
i: INTEGER;
BEGIN
x := 0; i := 0;
ReadString(tw,str);
neg := FALSE;
IF str[0]="-" THEN neg := TRUE; i := 1 END;
LOOP
ch := str[i];
CASE ch OF
0X: IF neg THEN x := -x END; RETURN TRUE |
"0".."9":
d := ORD(ch)-ORD("0");
IF (MAX(LONGINT)-d) DIV 10 >= x THEN x := 10*x+d ELSE EXIT END |
ELSE EXIT END;
INC(i);
END;
RETURN FALSE;
END ReadInt;
PROCEDURE ReadHex*(tw: TxtWinPtr; VAR x: LONGINT): BOOLEAN;
VAR
ch: CHAR;
d: LONGINT;
str: String;
i: INTEGER;
BEGIN
x := 0; i := 0;
ReadString(tw,str);
LOOP
ch := str[i];
CASE ch OF
0X: RETURN TRUE |
"0".."9": DEC(ch,ORD("0")) |
"A".."F": DEC(ch,ORD("A")-10) |
"a".."f": DEC(ch,ORD("a")-10) |
ELSE EXIT END;
d := ORD(ch);
IF (MAX(LONGINT)-d) DIV 16 >= x THEN x := 16*x+d ELSE EXIT END;
INC(i);
END;
RETURN FALSE;
END ReadHex;
(*-------------------------------------------------------------------------*)
BEGIN
lst.Init(WinList);
CLOSE
LOOP
n := sys.VAL(TxtWinPtr,lst.Head(WinList));
IF n = NIL THEN EXIT END;
CloseTextWin(n);
END;
END TextWindows.